有序集合的集合操作

集合类型提供了强大的集合操作命令,但是如果需要排序就要用到有序集合类型.有序集合常见的使用场景是大数据排序,如玩家的排行榜,所以很少会需要获得键中的全部数据

sort命令

sort命令可以对列表类型,集合类型,和有序集合类型键进行排序.

1
redis> sort mylist # 即可排序

对有序集合类型进行排序时会忽略元素的分数,只针对元素自身的值进行排序.

1
2
3
4
5
6
7
redis> ZADD myzset 50 2 40 3 20 1 60 5
(integer) 4
redis> SORT myzset
"1"
"2"
"3"
"5"

sort还可以通过ALPHA参数实现按照字段顺序排序非数字元素

1
redis> SORT myalphalist ALPHA

加入DESC进行倒序排列

1
SORT mylist DESC

指定limit 参数来指定返回范围的结果

1
SORT mylist DESC LIMIT 1 2 # 跳过第一个元素获取后面两个元素

By参数

很多情况下列表,集合,有序集合中存储的都是代表对象的对象ID,单纯对这些ID排序意义不大,更有用的是根据ID对应的对象的某一个属性进行排序. 这时需要使用BY参数

by参数的语法为BY参考键其中参考键可以是字符串类型键或者是散列类型键的某一个字段(表示为散列键名->字段名) 如果使用了BY参数,sort命令将不再按照元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个*并获取其值,然后依据该值对元素排序.

1
2
3
redis> sort mylist BY post:*->time DESC
假设mylist中有元素 12 26 6 2 ,
那么将去寻找 post:12 ,post:26, post:6, post:2 这四个散列键中的time字段的值来决定mylist中元素的排序顺序.

参考键也可以是字符串类型

1
2
3
4
5
6
redis> LPUSH sortbylist 2 1 3
redis> SET item:1 50
redis> SET item:2 100
redis> SET item:3 75
redis> SORT sortbylist by item:* DESC
输出 2 3 1

GET 参数

GET 参数不影响排序,它的作用是使SORT命令的返回结果不再是元素自身的值,而是GET参数中指定的键值.GET参数的规则和BY参数一样,GET参数也支持字符串类型和散列类型的键,并使用”*” 作为占位符.

要实现排序后直接返回排序用的值,可以这样

1
2
3
redis> SORT mylist By post:*->time DESC GET post:*->time
# 还可以有多个GET参数
redis> SORT mylist By post:*->time DESC GET post:*->time GET post:*->name

GET # 返回元素本身的值.

STORE 参数

默认情况下 sort 会直接返回排序结果,如果希望保存排序结果,可以使用STORE 参数,